<?php
class Delivery_Model_DbTable_Negocios
	extends Delivery_Model_DbTable_Desactivable

{
	protected $_name = 'negocios';
	protected $_primary = 'idNegocio';
	
	public function update( $negocio ){	
		
		return parent::update(
			$this->_fecha( $this->_getData( $negocio ), false, true),
			array('idNegocio = ?' => $negocio->idNegocio)		
		);
	}
	
	public function insert( $negocio ){	
		
		$data = $this->_fecha( $this->_getData( $negocio ), true, true);
		$data['ultimoPing'] = $data['fechaCreacion'];
		return parent::insert(
			$data
		);	
	}
	
	public function delete ( $negocio )
	{
		return parent::delete(array('idNegocio = ?' => $negocio->idNegocio));
	}	
	
	public function getById( $idNegocio ){
		
		$row =  
			$this->_db->fetchRow(
				$this->select()->where('idNegocio = ?', $idNegocio, Zend_Db::INT_TYPE)
			);
			
		return $row;
	}
	
	/**
	 * @param array $ids
	 * @return array:
	 */
	public function getByIds( $ids )
	{
		return $this->getAdapter()->fetchAll(
			$this->select()->where( 'idNegocio IN (?)', $ids, Zend_Db::INT_TYPE),
			null,
			Zend_Db::FETCH_ASSOC
		);		
	}
	
	public function getByUrl( $url ){
		
		return
			$this->_db->fetchRow(
				$this->select()->where('url = ?', $url)
			);
	}
	
	public function getByEmail( $email ){
		
		return 
			$this->_db->fetchRow(
				$this->select()->where('email = ?', $email)
			);
	}
	
	public function getByTag( $idTag ){
		
		$select = $this->select( self::SELECT_WITH_FROM_PART )
					->setIntegrityCheck(false)
					->joinUsing('tags_negocio', 'idNegocio')
					->order('ranking DESC')
					->where('idTag = ?', $idTag, Zend_Db::INT_TYPE);
		
		return $this->_db->fetchAll( $select );
	}
	
	public function getByCiudad( $idCiudad ){
		
		$select = $this->select( self::SELECT_WITH_FROM_PART )
					->setIntegrityCheck(false)
					->joinUsing('direcciones', 'idDireccion')
					->order('ranking DESC')
					->where('idCiudad = ?', $idCiudad, Zend_Db::INT_TYPE);
		
		return $this->_db->fetchAll( $select );
		
		
		return $this->getByParams(array('idCiudad' => $idCiudad));
		
	}
	
    public function getByCiudadAndTag( $idCiudad, $idTag ){
		
		$select = $this->select( self::SELECT_WITH_FROM_PART )
					->setIntegrityCheck(false)
					->joinUsing('direcciones', 'idDireccion', array())
					->joinUsing('tags_negocio', 'idNegocio', array())
					->order('ranking DESC')
					->where('idCiudad = ?', $idCiudad, Zend_Db::INT_TYPE)
					->where('idTag = ?', $idTag, Zend_Db::INT_TYPE);
		
		return $this->_db->fetchAll( $select );
	}
		
	public function direccionEnZona( $idNegocio, $idDireccion ){
		
		$select1 = parent::select( self::SELECT_WITHOUT_FROM_PART)
					->from( $this->_name, array('zona'))
					->where('idNegocio = ?', $idNegocio); 
		
		$select2 = new Zend_Db_Select( $this->getAdapter() );
		
		$select2->from( 'direcciones', array('punto'))->where('idDireccion = ?', $idDireccion); 
		
		$select1 = $select1->assemble();
		$select2 = $select2->assemble();
		
		
		$sql = "SELECT Contains(($select1), ($select2))";
		
		
		return $this->getAdapter()->fetchOne( $sql );	
	}
	
	public function search( $key, $idDireccion = null, $offset, $limit, $orderBy ){
		
		$sql  = $this->_searchQuery( false, $key, $idDireccion, $offset, $limit, $orderBy);
		
		return $this->_db->fetchAll( $sql );
	}
	
	public function searchCount( $key, $idDireccion = null, $offset, $limit, $orderBy ){
		
		$sql  = $this->_searchQuery( true, $key, $idDireccion, $offset, $limit, $orderBy);
		
		$result = $this->_db->fetchRow( $sql );
		return $result['count'];
		
	}
	
	protected function _searchQuery( $count, $key, $idDireccion = null, $offset, $limit, $orderBy ){
		
		$sql = "SELECT " . ($count ? ' COUNT(1) as count ' : '*' ) . "
				FROM negocios n
				WHERE activo = 1";
		
		if ( $idDireccion ) {
			
			$zonas = Delivery_Model_Factory::dbTable('Zonas');
			
			$ids = $zonas->getNegociosByDireccion( $idDireccion );
			
			if( empty($ids) ){
				$sql.= " AND 1 = 2";
			} else {
				$ids = implode(",", $ids);
				$sql.= " AND idNegocio IN ({$ids})";
			}
		} 
		
		if ( $key ) {
			
			if ( $idDireccion ) {
				$sql.= " AND ( nombre LIKE ? OR ";
			} else {
				$sql.= " AND nombre LIKE ? OR ";
			}
			
			
			$sql.= "		
			    idNegocio IN (
				SELECT p.idNegocio 
				FROM productos p  
				JOIN categorias c  USING (idCategoria)
				WHERE CONCAT(p.nombre, ' ', c.nombre) LIKE ?
				AND p.idNegocio = n.idNegocio
			)
			
			
			OR idNegocio IN (
				SELECT tn.idNegocio 
				FROM tags_negocio tn  
				JOIN tags tg  USING (idTag)
				WHERE tg.nombre LIKE ?
				AND tn.idNegocio = n.idNegocio
			)";	
		
			if ( $idDireccion ) {
				$sql.= ")";		
			}
			
			$sql = $this->_db->quoteInto($sql, "%$key%");
			
		}
		
		if ( !$count ){
		
			$sql.= " ORDER BY $orderBy ";
	//		$sql = $this->_db->quoteInto($sql, $orderBy);
			
			$sql.= " LIMIT ? ";
			$sql = $this->_db->quoteInto($sql, $limit);
			
			$sql.= " OFFSET ? ";
			$sql = $this->_db->quoteInto($sql, $offset);
		}
		
		return $sql;
	}
	
	public function all(){
		return $this->_db->fetchAll($this->select());
	}
	
	public function countByCity()
	{
		$sql = "SELECT c.idCiudad, count(1) as cantidad, c.nombre as ciudad, c.provincia
                FROM negocios n
                JOIN direcciones d ON n.idDireccion = d.idDireccion
                JOIN ciudades c ON c.idCiudad = d.idCiudad
                WHERE activo = 1
                GROUP BY c.idCiudad
                ORDER BY cantidad DESC";
		
		return $this->_db->fetchAll( $sql );
	} 
	
	public function getByParams( $params, $offset = null, $limit = null, $order = null , $filterIds = null){
		
	    $withFromPart = self::SELECT_WITHOUT_FROM_PART;
	    
		if( isset($params['idCiudad']) || isset($params['idTag'])){
		    $withFromPart = self::SELECT_WITH_FROM_PART;
		}

	    $select = $this->select( $withFromPart );
	
		if ( $order){
		    
		    if ( is_array($order) ){
		    
		        foreach ( $order as $o){
		        
		            $o = $this->_name .'.'. $o;
			        $select->order( $o );
		        }
		        
		    } else {
		        $order = $this->_name .'.'. $order;
			    $select->order( $order );
		    }
		    
		}
		
		if ( $limit && !is_null($offset) ){
			$select->limit( $limit, $offset );
		}
		
	    if ( $filterIds && !is_null($filterIds) ){
			$select->where('idNegocio NOT IN(?) ', $filterIds, Zend_Db::INT_TYPE);
		}
		
	    if( isset($params['abierto']) ){
		    $select->where('abierto = ? ', $params['abierto'], Zend_Db::INT_TYPE);
		}
		
		if( isset($params['idCiudad']) ){
            
		    $select ->setIntegrityCheck(false)
					->joinUsing('direcciones', 'idDireccion')
					->where('idCiudad = ?', $params['idCiudad'], Zend_Db::INT_TYPE);
		} 
		
		if( isset($params['idTag']) ){
            
		    $select ->setIntegrityCheck(false)
					->joinUsing('tags_negocio', 'idNegocio')
					->where('idTag = ?', $params['idTag'], Zend_Db::INT_TYPE);
		} 
		
		return $this->_db->fetchAll( $select );
	}
	
	public function countByParams( $params )
	{	
        $select = $this->select()
				->from($this, array('count' => 'COUNT(1)'));
	    
	    if( isset($params['idCiudad']) ){
            
		    $select ->setIntegrityCheck(false)
					->joinUsing('direcciones', 'idDireccion', array())
					->where('idCiudad = ?', $params['idCiudad'], Zend_Db::INT_TYPE);
		} 
		
		if( isset($params['idTag']) ){
            
		    $select ->setIntegrityCheck(false)
					->joinUsing('tags_negocio', 'idNegocio', array())
					->where('idTag = ?', $params['idTag'], Zend_Db::INT_TYPE);
		} 
	    
//		if($_SERVER['REMOTE_ADDR'] == '186.18.88.130'){
//		    echo $select;
//		    exit;
//		}
		
	    
		$result = $this->_db->fetchRow($select);
		
		return $result['count'];			
	}
	
	public function updateRanking()
	{
		$sql = "UPDATE negocios SET ranking = 
					(( SELECT count(1) from pedidos p where p.idNegocio = negocios.idNegocio and p.estado < 5 ) * 10 ) + 
					 ( SELECT SUM(entrega) + SUM(calidad) + SUM(precio) FROM votos v WHERE v.idNegocio= negocios.idNegocio )";
	
		return $this->_db->query( $sql );
	}
	
	protected function _getData( $negocio )
	{
		$data = array (
   			'nombre'			=> $negocio->nombre,	   			
   			'telefono'			=> $negocio->telefono,
		    'email'				=> $negocio->email,
   			'abierto'			=> $negocio->abierto,
   			'delivery'			=> $negocio->delivery,
   			'pickup'			=> $negocio->pickup,
   			'programado'		=> $negocio->programado,
		    'idDireccion'		=> $negocio->idDireccion,
		    'tiempoEntrega'		=> $negocio->tiempoEntrega,
		    'url'				=> $negocio->url,
			'ultimoPing'		=> $negocio->ultimoPing,
			'descripcion'		=> $negocio->descripcion,
			'activo'			=> (int) $negocio->activo,
			'ratingEntrega'		=> (int) $negocio->ratingEntrega,
			'ratingCalidad'		=> (int) $negocio->ratingCalidad,
			'ratingPrecio'		=> (int) $negocio->ratingPrecio,
			'ordenCategorias'	=> $negocio->ordenCategorias,
			'notas'             => $negocio->notas,
			'picasaAlbumId'	    => $negocio->picasaAlbumId,
			'estado'	        => (int) $negocio->estado
   		);
   		
   		return $data;
	}  
	
	
}